--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android/app/src/main/java/com/meshchatx/RemoteBackendUrl.java e0f1f99cd1c208c5008a936230c38e448dddd45d (e0f1f99c) Text, 5.05 KB
T8b949e// SPDX-License-Identifier: 0BSD
Tff7b72package T7ee787com.meshchatxTb4b4b4;
Tff7b72import T7ee787androidx.annotation.NullableTb4b4b4;
Tff7b72import T7ee787java.net.URITb4b4b4;
Tff7b72import T7ee787java.net.URISyntaxExceptionTb4b4b4;
Tff7b72import T7ee787java.util.LocaleTb4b4b4;
T8b949e/**
* Normalize and validate a MeshChatX remote backend origin for the Android shell.
*
* Empty or null means use the on-device local backend. Only http(s) origins are
* accepted so the WebView never loads javascript or file schemes as the app root.
*/
Tff7b72public Tff7b72final Tff7b72class T56d364RemoteBackendUrl Tb4b4b4{
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3LOCAL_BACKEND_URL Tff7b72= Ta5d6ff"Ta5d6ffhttps://127.0.0.1:8000Ta5d6ff"Tb4b4b4;
Tff7b72private Td2a8ffRemoteBackendUrlTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
T8b949e/**
* @return normalized origin without trailing slash, or null for local backend
*/
Tf0883e@Nullable
Tff7b72public Tff7b72static Te6edf3String Td2a8ffnormalizeTb4b4b4(Tf0883e@Nullable Te6edf3String Te6edf3rawTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3raw Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3trimmed Tff7b72= Te6edf3rawTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3trimmedTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3URI Te6edf3uriTb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3uri Tff7b72= Tff7b72new Te6edf3URITb4b4b4(Te6edf3trimmedTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3URISyntaxException Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3scheme Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getSchemeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3scheme Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3schemeLower Tff7b72= Te6edf3schemeTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3ROOTTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Ta5d6ff"Ta5d6ffhttpTa5d6ff"Tb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3schemeLowerTb4b4b4) Tff7b72&Tff7b72& Tff7b72!Ta5d6ff"Ta5d6ffhttpsTa5d6ff"Tb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3schemeLowerTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3uriTb4b4b4.Te6edf3getUserInfoTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3uriTb4b4b4.Te6edf3getUserInfoTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3host Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getHostTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3host Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3hostTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nullTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3port Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3StringBuilder Te6edf3out Tff7b72= Tff7b72new Te6edf3StringBuilderTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3outTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3schemeLowerTb4b4b4)Tb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff://Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3appendTb4b4b4(Te6edf3hostTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3ROOTTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3port Tff7b72!Tff7b72= Tff7b72-T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff':'Tb4b4b4)Tb4b4b4.Te6edf3appendTb4b4b4(Te6edf3portTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3path Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getRawPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3path Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3pathTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Tff7b72!Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72while Tb4b4b4(Te6edf3pathTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4) Tff7b72&Tff7b72& Te6edf3pathTb4b4b4.Te6edf3lengthTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3path Tff7b72= Te6edf3pathTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3pathTb4b4b4.Te6edf3lengthTb4b4b4(Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3outTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3outTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffisValidTb4b4b4(Tf0883e@Nullable Te6edf3String Te6edf3rawTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3raw Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3trimmed Tff7b72= Te6edf3rawTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3trimmedTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3normalizeTb4b4b4(Te6edf3trimmedTb4b4b4) Tff7b72!Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3String Td2a8ffresolveEffectiveUrlTb4b4b4(Tf0883e@Nullable Te6edf3String Te6edf3storedRemoteTb4b4b4) Tb4b4b4{
Te6edf3String Te6edf3normalized Tff7b72= Te6edf3normalizeTb4b4b4(Te6edf3storedRemoteTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3normalized Tff7b72!Tff7b72= Tff7b72null Tff7b72? Te6edf3normalized Tb4b4b4: Te6edf3LOCAL_BACKEND_URLTb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffisLocalBackendUrlTb4b4b4(Te6edf3String Te6edf3urlTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3url Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3n Tff7b72= Te6edf3normalizeTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3LOCAL_BACKEND_URLTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3nTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffisLoopbackHostTb4b4b4(Tf0883e@Nullable Te6edf3String Te6edf3hostTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3host Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3h Tff7b72= Te6edf3hostTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3ROOTTb4b4b4)Tb4b4b4;
Tff7b72return Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"Tb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3hTb4b4b4)
Tff7b72|Tff7b72| Ta5d6ff"Ta5d6fflocalhostTa5d6ff"Tb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3hTb4b4b4)
Tff7b72|Tff7b72| Ta5d6ff"Ta5d6ff[::1]Ta5d6ff"Tb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3hTb4b4b4)
Tff7b72|Tff7b72| Ta5d6ff"Ta5d6ff::1Ta5d6ff"Tb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3hTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* True when url is the backend root or a same-origin path under it.
*/
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffmatchesBackendTb4b4b4(Tf0883e@Nullable Te6edf3String Te6edf3urlTb4b4b4, Tf0883e@Nullable Te6edf3String Te6edf3backendUrlTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3url Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3backendUrl Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Ta5d6ff"Ta5d6ffabout:blankTa5d6ff"Tb4b4b4.Te6edf3equalsIgnoreCaseTb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3URI Te6edf3pageTb4b4b4;
Te6edf3URI Te6edf3backendTb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3page Tff7b72= Tff7b72new Te6edf3URITb4b4b4(Te6edf3urlTb4b4b4)Tb4b4b4;
Te6edf3backend Tff7b72= Tff7b72new Te6edf3URITb4b4b4(Te6edf3backendUrlTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3URISyntaxException Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pageTb4b4b4.Te6edf3getSchemeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3backendTb4b4b4.Te6edf3getSchemeTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3pageTb4b4b4.Te6edf3getSchemeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3equalsIgnoreCaseTb4b4b4(Te6edf3backendTb4b4b4.Te6edf3getSchemeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3pageTb4b4b4.Te6edf3getHostTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3backendTb4b4b4.Te6edf3getHostTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3pageTb4b4b4.Te6edf3getHostTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3equalsIgnoreCaseTb4b4b4(Te6edf3backendTb4b4b4.Te6edf3getHostTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tffa657int Te6edf3pagePort Tff7b72= Te6edf3effectivePortTb4b4b4(Te6edf3pageTb4b4b4)Tb4b4b4;
Tffa657int Te6edf3backendPort Tff7b72= Te6edf3effectivePortTb4b4b4(Te6edf3backendTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pagePort Tff7b72!Tff7b72= Te6edf3backendPortTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3backendPath Tff7b72= Te6edf3backendTb4b4b4.Te6edf3getRawPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3backendPath Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3backendPathTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4) Tff7b72|Tff7b72| Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3backendPathTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3pagePath Tff7b72= Te6edf3pageTb4b4b4.Te6edf3getRawPathTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3pagePath Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3pagePath Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3pagePathTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3backendPathTb4b4b4)
Tff7b72|Tff7b72| Te6edf3pagePathTb4b4b4.Te6edf3startsWithTb4b4b4(Te6edf3backendPathTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4) Tff7b72? Te6edf3backendPath Tb4b4b4: Te6edf3backendPath Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72private Tff7b72static Tffa657int Td2a8ffeffectivePortTb4b4b4(Te6edf3URI Te6edf3uriTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3port Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getPortTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3port Tff7b72!Tff7b72= Tff7b72-T79c0ff1Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3portTb4b4b4;
Tb4b4b4}
Te6edf3String Te6edf3scheme Tff7b72= Te6edf3uriTb4b4b4.Te6edf3getSchemeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3scheme Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3schemeTb4b4b4.Te6edf3equalsIgnoreCaseTb4b4b4(Ta5d6ff"Ta5d6ffhttpsTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff443Tb4b4b4;
Tb4b4b4}
Tff7b72return T79c0ff80Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────